﻿////////////////////////////////////////////////////////////////////////////
// 
// Copyright (C) 2007 e-Channels CORPORATION
// 
// ALL RIGHTS RESERVED BY e-Channels CORPORATION, THIS PROGRAM
// MUST BE USED SOLELY FOR THE PURPOSE FOR WHICH IT WAS  
// FURNISHED BY e-Channels CORPORATION, NO PART OF THIS PROGRAM
// MAY BE REPRODUCED OR DISCLOSED TO OTHERS, IN ANY FORM
// WITHOUT THE PRIOR WRITTEN PERMISSION OF e-Channels CORPORATION.
// USE OF COPYRIGHT NOTICE DOES NOT EVIDENCE PUBLICATION
// OF THE PROGRAM
// 
//			e-Channels CONFIDENTIAL AND PROPRIETARY
// 
////////////////////////////////////////////////////////////////////////////
// 
// $Log: LianaFormat.java,v $
// Revision 1.3  2010/11/25 10:48:53  guozhuangpeng
// �޸Ľ���ʽ������
//
// Revision 1.2  2010/10/29 09:29:25  base_dev_guoxiaofeng
// �޸�����
//
// Revision 1.1.2.1  2010/01/29 02:04:52  base_dev_haozheng
// ���������
//
// Revision 1.1  2009/07/04 06:51:41  base_dev_fuwei
// ��ʼ�汾
//
// Revision 1.10  2009/03/16 10:26:44  zhuding
// ͳһ�޸��ļ�����ΪUTF-8
//
// Revision 1.9  2009/03/16 10:09:10  liushj
// 编码问题修改
//
// Revision 1.8  2008/10/24 08:47:08  lilh
// 完善输入 money 是否有小数点判断
//
// Revision 1.7  2008/10/24 07:54:50  lilh
// 李璐宏~
//
// Revision 1.6  2008/10/23 07:43:10  lilh
// 李璐宏~
//
// Revision 1.5  2008/08/13 03:53:39  zhanghao
// Update
//
// Revision 1.4  2008/08/12 03:38:48  zhanghao
// 添加nvl方法
//
// Revision 1.3  2008/07/28 09:36:17  zhanghao
// 添加方法unFormatCurrency
//
// Revision 1.2  2008/07/09 07:20:30  zhanghao
// 重构
//
// Revision 1.1  2008/05/05 12:28:27  zhanghao
// 初始版本
//
// Revision 1.5  2008/04/15 06:45:49  zhanghao
// 版本合并
//
// Revision 1.4  2007/12/12 05:43:37  zhanghao
// 重构
//
// Revision 1.3  2007/11/26 01:57:56  zhanghao
// 修正中文格式化的Bug
//
// Revision 1.2  2007/08/13 03:37:16  zhanghao
// 重构
//
// Revision 1.1  2007/08/13 03:27:35  zhanghao
// 初始版本
//
//
package cn.bbs.ba.format;

import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import org.apache.commons.lang.StringUtils;

import cn.bbs.ba.log.LogTrac;
import cn.bbs.ba.util.CommonUntil;

/**
 * <b>功能描述：</b><br>
 * Liana格式化公用方法类<br>
 * 
 * @version 1.0 2007-08-13
 * @author zhanghao@yuchengtech.com
 */
public class ZZZFormat {
	/**
	 * 数据库存储的默认时间格式
	 */
	public static final String DEFAULT_TIME_FORMAT_DB = "yyyyMMddHHmmss";
	/**
	 * 默认时间格式(EN)
	 */
	public static final String DEFAULT_TIME_FORMAT_EN = "yyyy-MM-dd HH:mm:ss";
	/**
	 * 默认时间格式(中文)
	 */
	public static final String DEFAULT_TIME_FORMAT_CN = "yyyy年MM月dd日 HH:mm:ss";
	/**
	 * 默认日期格式(EN)
	 */
	public static final String DEFAULT_DATE_FORMAT_EN = "yyyy-MM-dd";
	/**
	 * 默认日期格式(中文)
	 */
	public static final String DEFAULT_DATE_FORMAT_CN = "yyyy年MM月dd日";
	/**
	 * 段内位置表示
	 */
	protected static final char[] CHINESE_MONEY_CONVERT_GROUP_IN = {'拾', '佰', '仟'};
	/**
	 * 段名表示
	 */
	protected static final char[] CHINESE_MONEY_CONVERT_GROUP_OUT = {'万', '亿', '兆'};
	/**
	 * 数字表示
	 */
	protected static final char[] CHINESE_MONEY_CONVERT_DIGIT = {'零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'};
	/**
	 * 单位表示
	 */
	protected static final String[] CHINESE_MONEY_UNIT = {"整", "分", "角", "圆"};

	/**
	 * 重新格式化时间
	 * 
	 * @param datetime
	 *            原有时间字符串，如20050101
	 * @param oldFormat
	 *            原有时间字符串的格式，如20050101160145为"yyyyMMddHHmmss"
	 * @param newFormat
	 *            新的时间字符串的格式，如2005-01-01 16:01:45为"yyyy-MM-dd HH:mm:ss"
	 * @return String
	 */
	public static String convertTimeFormat( String datetime, String oldFormat, String newFormat )
	{
		SimpleDateFormat oldFmt = null, newFmt = null;
		oldFmt = new SimpleDateFormat( oldFormat );
		newFmt = new SimpleDateFormat( newFormat );
		Date date = null;
		try
		{
			date = oldFmt.parse( datetime );
			return newFmt.format( date );
		}
		catch ( ParseException ex )
		{
			LogTrac.error( ex.toString() );
		}
		return datetime;
	}

	/**
	 * 显示中文金额
	 * 
	 * @param money
	 *            带小数点的实际金额字符
	 * @return String
	 */
	public static String formatChineseCurrency( String money )
	{
		money = unFormatCurrency(formatCurrency(money));
		try
		{
			int dotPostion = money.indexOf( '.' );
			int decimalPart = 0; // 小数部分
			String integerPart = ""; // 整数部分
			if(dotPostion > -1 ){ //传入数据有小数点
				if ( Integer.parseInt(money.substring( dotPostion + 1 ) ) > 0 && dotPostion> -1)//lilh@yuchengtech.com 2008-10-23修改，输入1以下的小数时会抛错 
				{
					decimalPart = Integer.parseInt( money.substring( dotPostion + 1 ) );
					integerPart = money.substring( 0, dotPostion );
				}
				else
				{
					integerPart = money.substring( 0, dotPostion );//lilh@yuchengtech.com 2008-10-24修改
				}
			}else{
				integerPart = money;
			}

			StringBuffer prefix = new StringBuffer(); // 整数部分转化的结果
			StringBuffer suffix = new StringBuffer(); // 小数部分转化的结果
			// 处理小数点后面的数
			if ( decimalPart == 0 )
			{ // 如果小数部分为0
				if("0".equals(integerPart)){//如果传进来的值为0.00
					suffix.append( CHINESE_MONEY_CONVERT_DIGIT[decimalPart] );
					suffix.append( CHINESE_MONEY_UNIT[3] );
				}
					suffix.append( CHINESE_MONEY_UNIT[0] );
			}
			else
			{
				if ( decimalPart < 10 )
				{
					// 转换分      
					if(!integerPart.equals("0")){//若整数部分不为零
						suffix.append( CHINESE_MONEY_CONVERT_DIGIT[0] );    //add by guozp：若为1.01应为1元零一分，而不是一元一分；若为0.01应为一分，而不是零一分
					}
					suffix.append( CHINESE_MONEY_CONVERT_DIGIT[decimalPart] );
					suffix.append( CHINESE_MONEY_UNIT[1] );
				}
				else if ( decimalPart % 10 == 0 )
				{
					// 转换角
					suffix.append( CHINESE_MONEY_CONVERT_DIGIT[decimalPart / 10] );
					suffix.append( CHINESE_MONEY_UNIT[2] );
				}
				else
				{
					// 转换角分
					suffix.append( CHINESE_MONEY_CONVERT_DIGIT[decimalPart / 10] );
					suffix.append( CHINESE_MONEY_UNIT[2] );
					suffix.append( CHINESE_MONEY_CONVERT_DIGIT[decimalPart % 10] );
					suffix.append( CHINESE_MONEY_UNIT[1] );
				}
			}
			// 处理小数点前面的数
			char[] chDig = integerPart.toCharArray(); // 把整数部分转化成字符数组
			boolean zero = false; // 标志'0'表示出现过0
			byte zeroSerNum = 0; // 连续出现0的次数
			for ( int i = 0; i < chDig.length; i++ )
			{ // 循环处理每个数字
				int idx = (chDig.length - i - 1) % 4; // 取段内位置
				int vidx = (chDig.length - i - 1) / 4; // 取段位置
				if ( chDig[i] == '0' )
				{ // 如果当前字符是0
					zeroSerNum++; // 连续0次数递增
					if ( zero == false )
					{ // 标志
						// zero = CHINESE_MONEY_CONVERT_DIGIT[0];
						zero = true;
						if ( idx == 0 && vidx > 0 )
						{
							prefix.append( CHINESE_MONEY_CONVERT_GROUP_OUT[vidx - 1] ); // 段结束位置应该加上段名如万,亿
						}
					}
					else if ( idx == 0 && vidx > 0 && zeroSerNum < 4 )
					{
						prefix.append( CHINESE_MONEY_CONVERT_GROUP_OUT[vidx - 1] );
						zero = false;
					}
					continue;
				}
				zeroSerNum = 0; // 连续0次数清零
				if ( zero )
				{ // 如果标志不为0,则加上,例如万,亿什么的
					prefix.append( CHINESE_MONEY_CONVERT_DIGIT[0] );
					zero = false;
				}
				prefix.append( CHINESE_MONEY_CONVERT_DIGIT[chDig[i] - '0'] ); // 转化该数字表示
				if ( idx > 0 )
				{
					prefix.append( CHINESE_MONEY_CONVERT_GROUP_IN[idx - 1] );
				}
				if ( idx == 0 && vidx > 0 )
				{
					prefix.append( CHINESE_MONEY_CONVERT_GROUP_OUT[vidx - 1] ); // 段结束位置应该加上段名如万,亿
				}
			}
			if ( prefix.length() > 0 )
				prefix.append( CHINESE_MONEY_UNIT[3] ); // 如果整数部分存在,则有圆的字样
			return prefix.append( suffix ).toString(); // 返回正确表示
		}
		catch ( Exception e )
		{
			return "input error";
		}
	}

	/**
	 * 格式化金额
	 * 
	 * @param currency
	 *            String
	 * @return String
	 */
	public static String formatCurrency( String currency )
	{
		if ( currency == null )
			return "";
		try
		{
			double dCurr = Double.parseDouble( currency );
			DecimalFormat dFmt = new DecimalFormat( "#,##0.00" );
			return dFmt.format( dCurr );
		}
		catch ( Exception ex )
		{
			return currency;
		}
	}

	/**
	 * 格式化金额
	 * 
	 * @param currency
	 *            String
	 * @return String
	 */
	public static String formatShowIp( String ip )
	{
		StringBuilder strIp = new StringBuilder();
		strIp.append(StringUtils.substring(ip, 0, 10));
		strIp.append("***");
		strIp.append(StringUtils.substring(ip, 14));
		return strIp.toString();
	}
	
	/**
	 * 根据参数格式显示格式化日期
	 * 
	 * @param date
	 * @param format
	 *            String
	 * @return String
	 */
	public static String formatDate( String date, String format )
	{
		Date dt = null;
		SimpleDateFormat inFmt = null, outFmt = null;
		ParsePosition pos = new ParsePosition( 0 );
		if ( (date == null) || (date.trim().equals( "" )) )
			return "";
		try
		{
			if ( Long.parseLong( date ) == 0 )
				return "";
		}
		catch ( Exception nume )
		{
			return date;
		}
		try
		{
			switch ( date.trim().length() ) {
				case 14 :
					inFmt = new SimpleDateFormat( "yyyyMMddHHmmss" );
					break;
				case 12 :
					inFmt = new SimpleDateFormat( "yyyyMMddHHmm" );
					break;
				case 10 :
					inFmt = new SimpleDateFormat( "yyyyMMddHH" );
					break;
				case 8 :
					inFmt = new SimpleDateFormat( "yyyyMMdd" );
					break;
				case 6 :
					inFmt = new SimpleDateFormat( "yyyyMM" );
					break;
				default :
					return date;
			}
			if ( (dt = inFmt.parse( date, pos )) == null )
				return date;
			if ( (format == null) || (format.trim().equals( "" )) )
			{
				outFmt = new SimpleDateFormat( "yyyy年MM月dd日" );
			}
			else
			{
				outFmt = new SimpleDateFormat( format );
			}
			return outFmt.format( dt );
		}
		catch ( Exception ex )
		{
			return date;
		}
	}
	 
	/**
	 * 取得若干天前/后的系统日期
	 * 
	 * @param days
	 *            与现在相隔的日数，正数为当前日期之后，负数为当前日期之前
	 * @param timeFormat
	 *            格式化
	 * @return String
	 */
	public static String getDifferentDate( int days, String timeFormat )
	{
		return getDifferentTime( 24 * days, 0, 0, timeFormat );
	}
	
	/**
	 * 相差时间
	 * @param startTime
	 * @param endTime
	 * @param format
	 */
	public static String dateDiff(String startTime, String endTime, String format) {
		// 按照传入的格式生成一个simpledateformate对象
		SimpleDateFormat sd = new SimpleDateFormat(format);
		long nd = 1000 * 24 * 60 * 60;// 一天的毫秒数
		long nh = 1000 * 60 * 60;// 一小时的毫秒数
		long nm = 1000 * 60;// 一分钟的毫秒数
		long ns = 1000;// 一秒钟的毫秒数
		long diff;
		try {
			// 获得两个时间的毫秒时间差异
			diff = sd.parse(endTime).getTime() - sd.parse(startTime).getTime();
			long day = diff / nd;// 计算差多少天
			long hour = diff % nd / nh;// 计算差多少小时
			long min = diff % nd % nh / nm;// 计算差多少分钟
			long sec = diff % nd % nh % nm / ns;// 计算差多少秒
			// 输出结果
			System.out.println("时间相差：" + day + "天" + hour + "小时" + min + "分钟"
					+ sec + "秒。");
			return day * 24 + hour + ":" + min +":" + sec;
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return "---";
	}
	
	/**
	 * yyyyMMddHHmmss
	 * @return
	 */
	public static String getTime() {
		return ZZZFormat.getDifferentTime(0,0,0,"yyyyMMddHHmmss");
	}
	/**
	 * 相差时间
	 * @param startTime
	 * @param endTime
	 * @param format
	 */
	public static String dateDiff(String endTime) {
		String format = "yyyyMMddHHmmss";
		String startTime = ZZZFormat.getDifferentTime(0,0,0,"yyyyMMddHHmmss");
		// 按照传入的格式生成一个simpledateformate对象
		SimpleDateFormat sd = new SimpleDateFormat(format);
		long nd = 1000 * 24 * 60 * 60;// 一天的毫秒数
		long nh = 1000 * 60 * 60;// 一小时的毫秒数
		long nm = 1000 * 60;// 一分钟的毫秒数
		long ns = 1000;// 一秒钟的毫秒数
		long diff;
		try {
			endTime = StringUtils.rightPad(endTime, 14, "0");
			startTime = StringUtils.rightPad(startTime, 14, "0");
			// 获得两个时间的毫秒时间差异
			diff = sd.parse(endTime).getTime() - sd.parse(startTime).getTime();
			long day = diff / nd;// 计算差多少天
			long hour = diff % nd / nh;// 计算差多少小时
			long min = diff % nd % nh / nm;// 计算差多少分钟
			long sec = diff % nd % nh % nm / ns;// 计算差多少秒
			// 输出结果
//			System.out.println("时间相差：" + day + "天" + hour + "小时" + min + "分钟"
//					+ sec + "秒。");
			String strhour = "";
			if (day * 24 + hour < 10) {
				strhour = "0" + CommonUntil.objToString(day * 24 + hour);
			}
			else {
				strhour = CommonUntil.objToString(day * 24 + hour);
			}
			String strmin = "";
			if (min < 10) {
				strmin = "0" + min;
			}
			else {
				strmin = CommonUntil.objToString(min);
			}
			String strsec = "";
			if (sec < 10) {
				strsec = "0" + sec;
			}
			else {
				strsec = CommonUntil.objToString(sec);
			}
			return strhour + ":" + strmin +":" + strsec;
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return "---";
	}
	
	/**
	 * 返回以毫秒为单位的当前时间。注意，当返回值的时间单位是毫秒时，<br>
	 * 值的粒度取决于基础操作系统，并且粒度可能更大。例如，许多操作系统以几十毫秒为单位测量时间。 
	 * @return
	 */
	public static synchronized String getSysteTime() {
		return CommonUntil.objToString(System.nanoTime());
	}
	
	/**
	 * 取得指定时间间隔后的系统时间<br>
	 * 示例：<br>
	 * getDifferentTime( 1, 2, 3,"yyyyMMddHHmmss") <br>
	 * 使用yyyyMMddHHmmss格式输出1小时2分3秒后的系统时间<br>
	 * getDifferentTime( -24, 0, 0,"yyyyMMdd") <br>
	 * 使用yyyyMMdd格式输出1天前的系统日期<br>
	 * 
	 * @param hour
	 *            小时
	 * @param minute
	 *            分钟
	 * @param second
	 *            秒
	 * @param timeFormat
	 *            格式化
	 * @return String
	 */
	public static String getDifferentTime( int hour, int minute, int second, String timeFormat )
	{
		String format = (timeFormat == null) ? ZZZFormat.DEFAULT_TIME_FORMAT_DB : timeFormat;
		GregorianCalendar calendar = (GregorianCalendar) Calendar.getInstance();
		calendar.add( Calendar.HOUR, hour );
		calendar.add( Calendar.MINUTE, minute );
		calendar.add( Calendar.SECOND, second );
		SimpleDateFormat formatter = new SimpleDateFormat( format );
		return formatter.format( calendar.getTime() );
	}

	/**
	 * 获取内容摘要，即字符串的前n个字符
	 * 
	 * @param content
	 *            原文
	 * @param summaryLength
	 *            摘要长度
	 * @return String
	 */
	public static String getSummary( String content, int summaryLength )
	{
		if ( content == null || summaryLength < 1 )
		{
			return "";
		}
		else
		{
			if ( content.length() > summaryLength )
			{
				return content.substring( 0, summaryLength );
			}
			else
			{
				return content;
			}
		}
	}

	/**
	 * 如果是空值，则以参数指定字符串取代
	 * 
	 * @param dataValue
	 * @param returnValue
	 * @return String
	 */
	public static String nvl( Object dataValue, String returnValue )
	{
		if ( null == dataValue || dataValue.toString().length() == 0 )
			return returnValue;
		else
			return dataValue.toString();
	}

	/**
	 * 反格式化金额，将含有,的金额中的,去掉
	 * 
	 * @param currency
	 *            String
	 * @return String
	 */
	public static String unFormatCurrency( String currency )
	{
		return currency.replaceAll( "\\,", "" );
	}

	/**
	 * 禁用构造函数
	 */
	private ZZZFormat() {
		// 禁用构造函数
	}
}